]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st/spinner-content: Fix CoglTexture leak
authorSebastian Keller <skeller@gnome.org>
Wed, 21 Jan 2026 18:50:33 +0000 (19:50 +0100)
committerSebastian Keller <skeller@gnome.org>
Wed, 21 Jan 2026 20:18:39 +0000 (21:18 +0100)
Most of the members were getting indirectly freed via the
st_spinner_content_set_actor (spinner, NULL) and the subsequent
st_spinner_content_invalidate () on destruction of the actor or
changing of its content when the spinner is stopped.
The texture however was not freed.

This now frees all members explicitly on finalize.

208 (96 direct, 112 indirect) bytes in 1 blocks are definitely lost in loss record 20,960 of 22,464
   at 0x4D37833: g_type_create_instance (gtype.c:1877)
   by 0x4D1C186: g_object_new_internal.part.0 (gobject.c:2666)
   by 0x4D1E0FA: g_object_new_internal (gobject.c:2982)
   by 0x4D1E0FA: g_object_new_valist (gobject.c:3004)
   by 0x4D1E488: g_object_new (gobject.c:2479)
   by 0x5A8B7CB: _cogl_texture_2d_create_base (cogl-texture-2d.c:84)
   by 0x572D668: st_spinner_content_paint_content (st-spinner-content.c:175)
   by 0x50D2C07: clutter_actor_paint_node (clutter-actor.c:3471)
   by 0x50D2C07: clutter_actor_continue_paint (clutter-actor.c:3726)
   by 0x511D4F9: clutter_paint_node_paint (clutter-paint-node.c:867)
   by 0x50D9717: clutter_actor_paint (clutter-actor.c:3670)
   by 0x574199A: st_viewport_paint (st-viewport.c:483)
   by 0x50D2C42: clutter_actor_continue_paint (clutter-actor.c:3728)
   by 0x511D4F9: clutter_paint_node_paint (clutter-paint-node.c:867)

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4045>

src/st/st-spinner-content.c

index 925667c25c818c40fbce86c4e5c141f25938d058..810e654631a888d6c5960b68da55780a75a19386 100644 (file)
@@ -77,9 +77,23 @@ st_spinner_content_init (StSpinnerContent *spinner)
 {
 }
 
+static void
+st_spinner_content_finalize (GObject *gobject)
+{
+  StSpinnerContent *spinner = ST_SPINNER_CONTENT (gobject);
+
+  g_clear_object (&spinner->timeline);
+  g_clear_object (&spinner->actor);
+  g_clear_object (&spinner->texture);
+  g_clear_object (&spinner->buffer);
+
+  G_OBJECT_CLASS (st_spinner_content_parent_class)->finalize (gobject);
+}
+
 static void
 st_spinner_content_class_init (StSpinnerContentClass *klass)
 {
+  G_OBJECT_CLASS (klass)->finalize = st_spinner_content_finalize;
 }
 
 static void